package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.ClaseEquipoPatronDTO;
import edu.shared.DTO.ComponentePatronDTO;
import edu.shared.DTO.EquipoPatronDTO;
import edu.shared.DTO.RenglonOrdenPedidoDTO;
import edu.shared.DTO.SubclaseEquipoPatronDTO;

public class P_AgregarDesdeAlmacen extends PopupPanel {
			
	private static final int CODIGO = 1;
	private static final int NOMBRE_PARA_CLIENTE = 2;
	private static final int PLANO = 3;
	private static final int CANTIDAD_DISPONIBLE = 4;
	private static final int CANTIDAD_A_RESERVAR = 5;
	
	private IngenieriaServiceAsync ingenieriaService;
	
	ListBox tipoCombo;
	ListBox claseEquipoCombo;
	ListBox subclaseEquipoCombo;
	Label componenteLabel;
	ListBox componenteCombo;
	
	FlexTable equiposYComponentesFT;
	
	List<EquipoPatronDTO> equiposPatronDTO;
	List<ComponentePatronDTO> componentesPatronDTO;
	LinkedList<RenglonOrdenPedidoDTO> renglonesDesdeAlmacen = new LinkedList<RenglonOrdenPedidoDTO>();
	
	public P_AgregarDesdeAlmacen(TabPanel padre) {
		
		super(false);		
		
		setStyleName("fondoPopup");
		
		LayoutPanel layoutPanel = new LayoutPanel();
		setWidget(layoutPanel);
		layoutPanel.setSize("1000px", "640px");
		
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		ingenieriaService.buscarEquiposPatronEnAlmacen(new AsyncCallback<List<EquipoPatronDTO>>() {
			public void onSuccess(List<EquipoPatronDTO> result) {
				equiposPatronDTO = result;
								
				cargarEquiposEnStock(equiposPatronDTO);
			}

			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});
		
		ingenieriaService.buscarComponentesPatronEnAlmacen(new AsyncCallback<List<ComponentePatronDTO>>() {
			public void onSuccess(List<ComponentePatronDTO> result) {
				
				componentesPatronDTO = new LinkedList<ComponentePatronDTO>();
				
				for (int i = 0; i < result.size(); i++) {					
					if (result.get(i).getCantidadDisponible() > 0) {
						componentesPatronDTO.add(result.get(i));
					}
				}
									
				cargarComponentesEnStock(componentesPatronDTO);
			}

			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});
		
		Label buscarPorBtn = new Label("FILTROS");
		buscarPorBtn.setStyleName("labelTitulo");
		layoutPanel.add(buscarPorBtn);
		layoutPanel.setWidgetLeftWidth(buscarPorBtn, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(buscarPorBtn, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label tipoLabel = new Label("TIPO:");
		tipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		tipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(tipoLabel);
		layoutPanel.setWidgetLeftWidth(tipoLabel, 2.0, Unit.PCT, 15.7, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tipoLabel, 75.0, Unit.PX, 19.0, Unit.PX);
		
		tipoCombo = new ListBox();
		layoutPanel.add(tipoCombo);
		layoutPanel.setWidgetLeftWidth(tipoCombo, 18.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tipoCombo, 70.0, Unit.PX, 32.0, Unit.PX);
		
		tipoCombo.addItem("EQUIPO");
		tipoCombo.addItem("COMPONENTE");
		
		//Si se cambia el tipo seleccionado, se modifican los campos mostrados.
		tipoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO")) {
					componenteLabel.setVisible(false);
					componenteCombo.setVisible(false);
					subclaseEquipoCombo.setEnabled(false);
					
					cargarComboClaseEquipo();
				}
				
				else {
					componenteLabel.setVisible(true);
					componenteCombo.setVisible(true);
					subclaseEquipoCombo.setEnabled(false);
					componenteCombo.setEnabled(false);
					
					cargarComboClaseEquipoComponente();
				}
			}
		});
		
		AbsolutePanel equipoOComponenteAP = new AbsolutePanel();
		equipoOComponenteAP.setStyleName("panelConBorde");
		layoutPanel.add(equipoOComponenteAP);
		layoutPanel.setWidgetLeftWidth(equipoOComponenteAP, 4.0, Unit.PCT, 91.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equipoOComponenteAP, 105.0, Unit.PX, 85.0, Unit.PX);
		
		Label claseEquipoLabel = new Label("CLASE DE EQUIPO:");
		claseEquipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		claseEquipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(claseEquipoLabel);
		layoutPanel.setWidgetLeftWidth(claseEquipoLabel, 2.0, Unit.PCT, 15.7, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseEquipoLabel, 125.0, Unit.PX, 19.0, Unit.PX);
		
		claseEquipoCombo = new ListBox();
		layoutPanel.add(claseEquipoCombo);
		layoutPanel.setWidgetLeftWidth(claseEquipoCombo, 18.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseEquipoCombo, 118.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia la clase de equipo seleccionada, listamos las subclases correspondientes.
		claseEquipoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO")) {
					if(!claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).equals("TODAS LAS CLASES")) {
						cargarComboSubclaseEquipo();
						subclaseEquipoCombo.setEnabled(true);
					}
					else {
						subclaseEquipoCombo.setSelectedIndex(0);
						subclaseEquipoCombo.setEnabled(false);
					}
				}
				
				else {				
					if(!claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).equals("TODAS LAS CLASES")) {
						cargarComboSubclaseEquipoComponente();	
						subclaseEquipoCombo.setEnabled(true);
					}
					else {
						subclaseEquipoCombo.setSelectedIndex(0);
						subclaseEquipoCombo.setEnabled(false);
					}
					componenteCombo.setSelectedIndex(0);
					componenteCombo.setEnabled(false);
				}
			}
		});
		
		Label subclaseEquipoLabel = new Label("SUBCLASE DE EQUIPO:");
		subclaseEquipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		subclaseEquipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(subclaseEquipoLabel);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoLabel, /*49.0*/52.0, Unit.PCT, 15.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoLabel, 123.0, Unit.PX, 19.0, Unit.PX);
		
		subclaseEquipoCombo = new ListBox();
		layoutPanel.add(subclaseEquipoCombo);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoCombo, /*65.0*/68.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoCombo, 118.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia la subclase de componente seleccionada, listamos los componentes correspondientes.
		subclaseEquipoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("COMPONENTE")) {
					if(!subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).equals("TODAS LAS SUBCLASES")) {
						cargarComboComponente();
						componenteCombo.setEnabled(true);
					}
					else {
						componenteCombo.setSelectedIndex(0);
						componenteCombo.setEnabled(false);
					}
				}
			}
		});
		
		componenteLabel = new Label("COMPONENTE:");
		componenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		componenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(componenteLabel);
		layoutPanel.setWidgetLeftWidth(componenteLabel, 2.0, Unit.PCT, 15.7, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteLabel, 158.0, Unit.PX, 19.0, Unit.PX);
		
		componenteCombo = new ListBox();
		layoutPanel.add(componenteCombo);
		layoutPanel.setWidgetLeftWidth(componenteCombo, 18.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteCombo, 153.0, Unit.PX, 32.0, Unit.PX);
		
		Button buscarBtn = new Button("BUSCAR");
		buscarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				buscar();
			}
		});		
		
		layoutPanel.add(buscarBtn);
		layoutPanel.setWidgetLeftWidth(buscarBtn, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(buscarBtn, 215.0, Unit.PX, 28.0, Unit.PX);
		
		componenteLabel.setVisible(false);
		componenteCombo.setVisible(false);
		subclaseEquipoCombo.setEnabled(false);
		
		Label disponibilidadAlmacenLabel = new Label("DISPONIBILIDAD EN ALMACÉN");
		disponibilidadAlmacenLabel.setStyleName("labelTitulo");
		layoutPanel.add(disponibilidadAlmacenLabel);
		layoutPanel.setWidgetLeftWidth(disponibilidadAlmacenLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(disponibilidadAlmacenLabel, 250.0, Unit.PX, 50.0, Unit.PX);
				
		ScrollPanel contenedorTablaSP = new ScrollPanel();
		contenedorTablaSP.setStyleName("tabla");
		layoutPanel.add(contenedorTablaSP);
		layoutPanel.setWidgetLeftWidth(contenedorTablaSP, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(contenedorTablaSP, 305.0, Unit.PX, 250.0, Unit.PX);
		
		equiposYComponentesFT = new FlexTable();
		contenedorTablaSP.setWidget(equiposYComponentesFT);
		equiposYComponentesFT.setSize("100%", "45px");
				
		equiposYComponentesFT.setText(0, CODIGO, "CÓDIGO");
		equiposYComponentesFT.getCellFormatter().setWidth(0, CODIGO, "20%");
		equiposYComponentesFT.setText(0, NOMBRE_PARA_CLIENTE, "NOMBRE PARA CLIENTE");
		equiposYComponentesFT.getCellFormatter().setWidth(0, NOMBRE_PARA_CLIENTE, "50%");
		equiposYComponentesFT.setText(0, PLANO, "PLANO");
		equiposYComponentesFT.getCellFormatter().setWidth(0, PLANO, "10%");
		equiposYComponentesFT.setText(0, CANTIDAD_DISPONIBLE, "CANTIDAD DISPONIBLE");
		equiposYComponentesFT.getCellFormatter().setWidth(0, CANTIDAD_DISPONIBLE, "10%");
		equiposYComponentesFT.setText(0, CANTIDAD_A_RESERVAR, "CANTIDAD A RESERVAR");
		equiposYComponentesFT.getCellFormatter().setWidth(0, CANTIDAD_A_RESERVAR, "10%");
		
		equiposYComponentesFT.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pieLabel, /*775.0*/555.0, Unit.PX, 50.0, Unit.PX);
		
		Button cancelarBtn = new Button("SALIR");
		cancelarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				renglonesDesdeAlmacen.clear();
				salir();
			}
		});
		
		layoutPanel.add(cancelarBtn);
		layoutPanel.setWidgetRightWidth(cancelarBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cancelarBtn, 610.0, Unit.PX, 28.0, Unit.PX);
		
		Button asignarBtn = new Button("ASIGNAR");
		asignarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if(validarCampos()) {
					asignar();
					salir();
				}
			}
		});
		
		layoutPanel.add(asignarBtn);
		layoutPanel.setWidgetRightWidth(asignarBtn, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(asignarBtn, 610.0, Unit.PX, 28.0, Unit.PX);
		
		cargarComboClaseEquipo();
	}
	
	/**
	 * Método que carga todos los equipos en la tabla.
	 */
	private void cargarEquiposEnStock(List<EquipoPatronDTO> equiposPatronDTOACargar) {
		
		for (int i = 0; i < equiposPatronDTOACargar.size(); i++) {
			
			int cantidadFilas = equiposYComponentesFT.getRowCount();
			
			TextBox cantidadAReservar = new TextBox();			
			cantidadAReservar.setSize("85%", "85%");
			cantidadAReservar.setMaxLength(3);
			
			equiposYComponentesFT.setWidget(cantidadFilas, CODIGO, new Label(Validaciones.rellenarCodigoEquipoPatron(equiposPatronDTOACargar.get(i))));
			equiposYComponentesFT.getCellFormatter().setWordWrap(cantidadFilas, CODIGO, true);
			equiposYComponentesFT.setWidget(cantidadFilas, NOMBRE_PARA_CLIENTE, new Label(equiposPatronDTOACargar.get(i).getNombreClase() + " - " + equiposPatronDTOACargar.get(i).getNombreSubclase()));
			equiposYComponentesFT.getCellFormatter().setWordWrap(cantidadFilas, NOMBRE_PARA_CLIENTE, true);
			equiposYComponentesFT.setWidget(cantidadFilas, PLANO, new Label(String.valueOf(equiposPatronDTOACargar.get(i).getPlano())));
			equiposYComponentesFT.getCellFormatter().setWordWrap(cantidadFilas, PLANO, false);
			equiposYComponentesFT.setWidget(cantidadFilas, CANTIDAD_DISPONIBLE, new Label(String.valueOf(equiposPatronDTOACargar.get(i).getCantidadDisponible())));
			equiposYComponentesFT.getCellFormatter().setWordWrap(cantidadFilas, CANTIDAD_DISPONIBLE, true);
			equiposYComponentesFT.setWidget(cantidadFilas, CANTIDAD_A_RESERVAR, cantidadAReservar);
			equiposYComponentesFT.getRowFormatter().setStyleName(cantidadFilas, "tablaRenglon");
			
			cantidadAReservar.setStyleName("textBoxTabla");
		}
	}
	
	/**
	 * Método que carga todos los componentes en la tabla.
	 */
	private void cargarComponentesEnStock(List<ComponentePatronDTO> componentesPatronDTOACargar) {
		
		for (int i = 0; i < componentesPatronDTOACargar.size(); i++) {
			
			int cantidadFilas = equiposYComponentesFT.getRowCount();
			
			TextBox cantidadAReservar = new TextBox();			
			cantidadAReservar.setSize("85%", "85%");
			cantidadAReservar.setMaxLength(3);
			
			equiposYComponentesFT.setWidget(cantidadFilas, CODIGO, new Label(Validaciones.rellenarCodigoComponentePatron(componentesPatronDTOACargar.get(i))));
			equiposYComponentesFT.getCellFormatter().setWordWrap(cantidadFilas, CODIGO, true);
			equiposYComponentesFT.setWidget(cantidadFilas, NOMBRE_PARA_CLIENTE, new Label(componentesPatronDTOACargar.get(i).getNombre()));
			equiposYComponentesFT.getCellFormatter().setWordWrap(cantidadFilas, NOMBRE_PARA_CLIENTE, true);
			equiposYComponentesFT.setWidget(cantidadFilas, PLANO, new Label(String.valueOf(componentesPatronDTOACargar.get(i).getPlano())));
			equiposYComponentesFT.getCellFormatter().setWordWrap(cantidadFilas, PLANO, false);
			equiposYComponentesFT.setWidget(cantidadFilas, CANTIDAD_DISPONIBLE, new Label(String.valueOf(componentesPatronDTOACargar.get(i).getCantidadDisponible())));
			equiposYComponentesFT.getCellFormatter().setWordWrap(cantidadFilas, CANTIDAD_DISPONIBLE, true);
			equiposYComponentesFT.setWidget(cantidadFilas, CANTIDAD_A_RESERVAR, cantidadAReservar);
			equiposYComponentesFT.getRowFormatter().setStyleName(cantidadFilas, "tablaRenglon");
			
			cantidadAReservar.setStyleName("textBoxTabla");
		}
	}
	
	/**
	 * Asigna los renglones desde almacén a una variable que será leída posteriormente.
	 */
	protected void asignar() {
		
		renglonesDesdeAlmacen.clear();
		
		for (int numeroFila = 1; numeroFila < equiposYComponentesFT.getRowCount(); numeroFila++) {
			
			//Para todas las filas que se quiera guardar algo.
			if (!((TextBox) equiposYComponentesFT.getWidget(numeroFila, CANTIDAD_A_RESERVAR)).getText().equals("")) {
				String codigo = equiposYComponentesFT.getText(numeroFila, CODIGO);
				String nombreParaCliente = equiposYComponentesFT.getText(numeroFila, NOMBRE_PARA_CLIENTE);
				String cantidad = ((TextBox) equiposYComponentesFT.getWidget(numeroFila, CANTIDAD_A_RESERVAR)).getText();
				String observaciones = "DESDE ALMACÉN";
							
				RenglonOrdenPedidoDTO renglon = new RenglonOrdenPedidoDTO();
				
				renglon.setEquipoOComponente(Validaciones.equipoOComponente(codigo));
		
				renglon.setCodigo(codigo);
				renglon.setNombre(nombreParaCliente);
				renglon.setCantidad(Integer.parseInt(cantidad));
				renglon.setObservaciones(observaciones);
				renglon.setEnAlmacen(true);
				
				renglonesDesdeAlmacen.add(renglon);
			}
		}
	}
	
	
	public boolean validarCampos() {
		
		List<String> errores = new LinkedList<String>();
		String mensaje = "";
		boolean resultado = true;
		
		for (int numeroFila = 1; numeroFila < equiposYComponentesFT.getRowCount(); numeroFila++) {
			
			if (!((TextBox) equiposYComponentesFT.getWidget(numeroFila, CANTIDAD_A_RESERVAR)).getText().equals("")) {
				
				try{
					int cantidadAReservar = Integer.parseInt(((TextBox) equiposYComponentesFT.getWidget(numeroFila, CANTIDAD_A_RESERVAR)).getText());
					int cantidadDisponible = Integer.parseInt(equiposYComponentesFT.getText(numeroFila, CANTIDAD_DISPONIBLE));
					
					if (cantidadAReservar <= 0)
						throw new Exception();
					
					else if (cantidadAReservar > cantidadDisponible)
						errores.add("- La \"Cantidad a reservar\" de la fila "+ numeroFila +" no puede ser mayor a la \"Cantidad  disponible\"");
				}
				
				catch(Exception e) {
					errores.add("- La \"Cantidad a reservar\" de la fila número "+ numeroFila +" sólo puede ser un número entero positivo.");
				}
			}
		}
				
		//Si hubo errores, armamos el mensaje de error.
		if(errores.size() > 0){
			resultado = false;
			
			mensaje = mensaje + errores.get(0);
			
			for(int i=1; i<errores.size(); i++)
				mensaje = mensaje + '\n' + '\n' + errores.get(i);
			
			Window.alert(mensaje);
		}
			
		return resultado;
	}
	
	
	/**
	 * Método que permite realizar el filtrado y buscar los equipos o componentes que decida el usuario.
	 */	
	protected void buscar() {
		
		int cantidadFilas = equiposYComponentesFT.getRowCount();
		
		for (int i = 1; i < cantidadFilas; i++) {
			equiposYComponentesFT.removeRow(1);
		}
		
		if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO")) {
			
			LinkedList<EquipoPatronDTO> equiposPatronDTOBuscados = new LinkedList<EquipoPatronDTO>();			
			
			//Si no se buscan todas las clases...
			if (!claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).equals("TODAS LAS CLASES")) {
				
				int claseBuscada = Integer.parseInt(claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - ")[0]);
				
				//Si no se buscan todas las subclases...
				if (!subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).equals("TODAS LAS SUBCLASES")) {
					
					int subclaseBuscada = Integer.parseInt(subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).split(" - ")[0]);
					
					for (EquipoPatronDTO equipoPatronDTO: equiposPatronDTO) {
						
						if((equipoPatronDTO.getCodigoClase() == claseBuscada) && (equipoPatronDTO.getCodigoSubclase() == subclaseBuscada))
							equiposPatronDTOBuscados.add(equipoPatronDTO);	
					}					
				}

				//Si se buscan todas las subclases...
				else {
					for (EquipoPatronDTO equipoPatronDTO: equiposPatronDTO) {
						
						if(equipoPatronDTO.getCodigoClase() == claseBuscada)
							equiposPatronDTOBuscados.add(equipoPatronDTO);	
					}	
				}
			}
			
			//Si se buscan todas las clases...
			else {
				for (EquipoPatronDTO equipoPatronDTO: equiposPatronDTO) {
					equiposPatronDTOBuscados.add(equipoPatronDTO);	
				}	
			}
			
			if(equiposPatronDTOBuscados.size() == 0)
				Window.alert("No existen equipos con los criterios buscados");
			
			cargarEquiposEnStock(equiposPatronDTOBuscados);
		}
		
		else {
			LinkedList<ComponentePatronDTO> componentesPatronDTOBuscados = new LinkedList<ComponentePatronDTO>();			
			
			//Si no se buscan todas las clases...
			if (!claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).equals("TODAS LAS CLASES")) {
				
				int claseBuscada = Integer.parseInt(claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - ")[0]);
				
				//Si no se buscan todas las subclases...
				if (!subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).equals("TODAS LAS SUBCLASES")) {
					
					int subclaseBuscada = Integer.parseInt(subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).split(" - ")[0]);
					
					//Si no se buscan todos los componentes...
					if (!componenteCombo.getItemText(componenteCombo.getSelectedIndex()).equals("TODOS LOS COMPONENTES")) {
						
						int componenteBuscado = Integer.parseInt(componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(0, 2));
						int subcomponenteBuscado = Integer.parseInt(componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(2, 4));
						
						for (ComponentePatronDTO componentePatronDTO: componentesPatronDTO) {
							
							if((componentePatronDTO.getCodigoClase() == claseBuscada) && (componentePatronDTO.getCodigoSubclase() == subclaseBuscada) &&
									(componentePatronDTO.getCodigoComponente() == componenteBuscado) && (componentePatronDTO.getCodigoSubcomponente() == subcomponenteBuscado))
								componentesPatronDTOBuscados.add(componentePatronDTO);
						}	
					}				
					
					//Si se buscan todos lo componentes...
					else {
						for (ComponentePatronDTO componentePatronDTO: componentesPatronDTO) {
							
							if((componentePatronDTO.getCodigoClase() == claseBuscada) && (componentePatronDTO.getCodigoSubclase() == subclaseBuscada))
								componentesPatronDTOBuscados.add(componentePatronDTO);	
						}	
					}
				}

				//Si se buscan todas las subclases...
				else {
					for (ComponentePatronDTO componentePatronDTO: componentesPatronDTO) {
						
						if(componentePatronDTO.getCodigoClase() == claseBuscada)
							componentesPatronDTOBuscados.add(componentePatronDTO);	
					}	
				}
			}
			
			//Si se buscan todas las clases...
			else {
				for (ComponentePatronDTO componentePatronDTO: componentesPatronDTO) {
					componentesPatronDTOBuscados.add(componentePatronDTO);	
				}	
			}
			
			if(componentesPatronDTOBuscados.size() == 0)
				Window.alert("No existen componentes con los criterios buscados");
			
			cargarComponentesEnStock(componentesPatronDTOBuscados);	
		}		
	}
	
	/**
	 * Método que permite cargar el comboBox de las clases de equipo con todas las clases existentes.
	 */
	private void cargarComboClaseEquipo() {
		
		claseEquipoCombo.clear();
		claseEquipoCombo.addItem("TODAS LAS CLASES");
		
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
			}

			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> result) {
				//Cargamos el comboBox con las clases de equipo patron existentes, mostrando código y nombre de la clase.
				for(ClaseEquipoPatronDTO claseEquipoPatronDTO : result)
					claseEquipoCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
				
				//cargamos el comboBox de subclases con las subclases pertenecientes a la clase seleccionada
				cargarComboSubclaseEquipo();
			}
		});
	}
	
	/**
	 * Método que permite cargar el comboBox de las subclases de equipo con todas las clases existentes.
	 */
	private void cargarComboSubclaseEquipo() {
		
		subclaseEquipoCombo.clear();
		subclaseEquipoCombo.addItem("TODAS LAS SUBCLASES");
		
		//Si hay que listar todas, que las liste nomas.
		if(!claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).equals("TODAS LAS CLASES")) {
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarSubclasesEquipoPatron(codigoClaseEquipoPatron, new AsyncCallback<List<SubclaseEquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<SubclaseEquipoPatronDTO> result) {					
					//Cargamos el comboBox con las subclases de equipo patron existentes, mostrando código y nombre de la subclase.
					for(SubclaseEquipoPatronDTO subclaseEquipoPatronDTO : result)
						subclaseEquipoCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipoPatronDTO.getCodigoSubclase()) + " - " + subclaseEquipoPatronDTO.getNombre());
				}
			});
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de las clases de equipo para componente con todas las clases existentes.
	 */
	private void cargarComboClaseEquipoComponente() {
		
		claseEquipoCombo.clear();
		claseEquipoCombo.addItem("TODAS LAS CLASES");
		
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
			}

			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> result) {
				//Cargamos el comboBox con las clases de equipo patron existentes, mostrando código y nombre de la clase.
				for(ClaseEquipoPatronDTO claseEquipoPatronDTO : result)
					claseEquipoCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
				
				//cargamos el comboBox de subclases con las subclases pertenecientes a la clase seleccionada
				cargarComboSubclaseEquipoComponente();
			}
		});
	}
	
	/**
	 * Método que permite cargar el comboBox de las subclases de equipo para componente con todas las clases existentes.
	 */
	private void cargarComboSubclaseEquipoComponente() {
		
		subclaseEquipoCombo.clear();
		subclaseEquipoCombo.addItem("TODAS LAS SUBCLASES");
		
		//Si se buscan todas las clases, que no busque subclases.
		if(!claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).equals("TODAS LAS CLASES")) {
						
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarSubclasesEquipoPatron(codigoClaseEquipoPatron, new AsyncCallback<List<SubclaseEquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<SubclaseEquipoPatronDTO> result) {					
					//Cargamos el comboBox con las subclases de equipo patron existentes para un componente, mostrando código y nombre de la subclase.
					for(SubclaseEquipoPatronDTO subclaseEquipoPatronDTO : result)
						subclaseEquipoCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipoPatronDTO.getCodigoSubclase()) + " - " + subclaseEquipoPatronDTO.getNombre());
					
					//Cargamos todos los componentes pertenecientes a una clase y subclase de equipo particular.
					cargarComboComponente();
				}
			});
		}
		else {
			componenteCombo.clear();
			componenteCombo.addItem("TODOS LOS COMPONENTES");
		}			
	}
	
	/**
	 * Método que permite cargar el comboBox de los componentes existentes.
	 */
	private void cargarComboComponente() {
		
		componenteCombo.clear();
		componenteCombo.addItem("TODOS LOS COMPONENTES");
		
		//Si se buscan todas las subclases, que no busque componentes.
		if(!subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).equals("TODAS LAS SUBCLASES")) {
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarComponentesPatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, new AsyncCallback<List<ComponentePatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
				
				@Override
				public void onSuccess(List<ComponentePatronDTO> result) {
					//Cargamos el comboBox con los componentes patron existentes, mostrando código y nombre.
					for(ComponentePatronDTO componentePatronDTO : result) {
						componenteCombo.addItem(Validaciones.rellenarCodigo(componentePatronDTO.getCodigoComponente()) + Validaciones.rellenarCodigo(componentePatronDTO.getCodigoSubcomponente()) + " - " + componentePatronDTO.getNombre());
					}
				}
			});
		}
	}
	
	protected void salir() {
		this.hide(true);
	}		
	
	public LinkedList<RenglonOrdenPedidoDTO> obtenerRenglonesDesdeAlmacen() {
		return renglonesDesdeAlmacen;
	}
}
